import {BaseLinkedListNodeModel} from "./BaseLinkedListNodeModel.js";

/**
 * @description 创建链表
 * @class {BaseLinkedListModel}
 * @author hhx
 * @date 2024-11-13 09:11
 * @version 0.1.2
 */
export class BaseLinkedListModel {

    /**
     * @description 链表
     * @pravite
     * @property
     * @type {object} 链表
     */
    _linkedList = null;

    /**
     * @description 创建节点构造函数
     * @public
     * @constructor
     */
    constructor() {
        //
    }

    //========================== 内部成员 ==========================

    /**
     * @description 获取 链表
     * @member
     * @protected
     * @return {object} 链表
     */
    get linkedList() {
        return this._linkedList;
    }

    /**
     * @description 设置 链表值
     * @member
     * @protected
     * @param value {object} 链表值对象
     */
    set linkedList(value) {
        this._linkedList = value;
    }

    //========================== 属性方法 ==========================

    /**
     * @description 获取链表
     * @public
     * @return {object} 链表
     */
    getLinkedList() {
        return this.linkedList;
    }

    /**
     * @description 设置链表值
     * @public
     * @param value {string|number} 设置的链表值
     */
    setLinkedList(value) {
        this.linkedList = value;
    }

    //========================== 接口 ==========================

    /**
     * @description 添加链表节点
     * @public
     * @param value {number|string} 节点值
     */
    addNode(value) {

        //创建新节点
        let newNode = new BaseLinkedListNodeModel(value);

        //判断新节点是否为空
        if (!this.linkedList) this.linkedList = newNode;

        else {

            //将旧链表保存
            let oldNode = this.linkedList;

            //迭代遍历链表节点并添加值
            while (oldNode) {

                //找到最后一个空节点
                if (oldNode.next == null) return oldNode.next = newNode;

                //迭代赋值
                oldNode = oldNode.next;

            }

        }

    }

    /**
     * @description 判断链表是否存在某个值
     * @public
     * @param value {string|number} 判断的值
     * @return {boolean} true 是 false 否
     */
    hasNode(value) {

        //深拷贝保存原始链表
        let oldNode = JSON.parse(JSON.stringify(this.linkedList));

        //迭代判断链表节点
        while (oldNode) {

            //判断是否相等
            if (oldNode._value === value) {
                return true;
            }

            //迭代遍历
            oldNode = oldNode._next;

        }

        return false;
    }

    /**
     * @description 删除链表节点
     * @public
     * @param value {string|number} 链表节点值
     */
    deleteNode(value) {

        //判断链表节点是否存在
        if (this.hasNode(value)) {

            //迭代遍历
            while (this.linkedList) {

                //边界条件 判断下一个节点的是否为空
                if (this.linkedList.next == null) {
                    return true;
                }

                //判断是否为删除的节点
                if (this.linkedList.next.value === value) {

                    this.linkedList.next = this.linkedList.next.next;

                }

                //迭代下一个节点
                this.linkedList = this.linkedList.next;
            }

        } else {
            console.log('链表节点不存在')
        }
    }
}